//package com.light.netty.server.init;
//
//import com.light.netty.server.handler.UdpBusinessServerHandler;
//import io.netty.bootstrap.Bootstrap;
//import io.netty.buffer.PooledByteBufAllocator;
//import io.netty.channel.*;
//import io.netty.channel.nio.NioEventLoopGroup;
//import io.netty.channel.socket.DatagramChannel;
//import io.netty.channel.socket.nio.NioDatagramChannel;
//import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
//import io.netty.handler.codec.LengthFieldPrepender;
//import io.netty.handler.codec.string.StringDecoder;
//import io.netty.handler.codec.string.StringEncoder;
//import io.netty.handler.logging.LogLevel;
//import io.netty.handler.logging.LoggingHandler;
//import io.netty.handler.timeout.IdleStateHandler;
//import io.netty.util.CharsetUtil;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PostConstruct;
//
///**
// * @author fuhui
// * @Description：
// * @data 2025/3/13 11:10
// */
//@Component
//public class UdpNettyServerInit {
//
//    private static final String HOST = "127.0.0.1";
//    private static final int PORT = 8082;
//
//    @PostConstruct
//    public void init() throws Exception {
//        System.out.println("初始化UDP服务端...........");
//        new Thread(() -> {
//
//            // 1. 初始化线程组
//            EventLoopGroup group = new NioEventLoopGroup();
//
//            try {
//                // 3. 配置 Bootstrap
//                Bootstrap b = new Bootstrap();
//                b.group(group)
//                        .channel(NioDatagramChannel.class) // 使用 NIO 模式-UDP
//                        .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) // 显式设置缓冲池分配器，自定义字节缓冲区分配策略，优化内存管理。
//                        .option(ChannelOption.MESSAGE_SIZE_ESTIMATOR, new DefaultMessageSizeEstimator(0)) // 需消息长度推断的场景：估算消息大小，用于流量控制或窗口扩展仍可接收）。
//                        .option(ChannelOption.AUTO_READ, true) // 允许半关闭（一方关闭发送，另一方仍可接收）。
//                        .option(ChannelOption.SO_BROADCAST, true)// 广播，允许发送广播消息。
//                        .option(ChannelOption.SO_REUSEADDR, true) // 允许端口复用，快速重启服务。
//                        .option(ChannelOption.IP_MULTICAST_TTL, 2) // 设置多播数据包的生存周期（TTL）。
//                        .handler(new ChannelInitializer<DatagramChannel>() {
//                            @Override
//                            protected void initChannel(DatagramChannel ch) throws Exception {
//                                ChannelPipeline pipeline = ch.pipeline();
//
//                                // 心跳检测（30秒无活动自动断开）不做任何处理
//                                pipeline.addLast(new IdleStateHandler(30, 0, 0));
//
//                                //自动处理粘包、简化消息解析、提高可靠性
////                                pipeline.addLast(new LengthFieldBasedFrameDecoder(65535, 0, 4, 8, 0));
////                                pipeline.addLast(new LengthFieldPrepender(4));
//
//                                // 3.4 日志记录
//                                pipeline.addLast(new LoggingHandler(LogLevel.INFO));
//
//                                // 3.5 业务处理器
//                                pipeline.addLast(new UdpBusinessServerHandler());
//                            }
//                        });
//
//                // 4. 绑定本地端口（非必须，但建议显式设置）
//
//                ChannelFuture f = b.bind(PORT).sync();
//                f.channel().closeFuture().sync();
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            } finally {
//                // 6. 释放资源
//                group.shutdownGracefully();
//            }
//        }).start();
//    }
//
//}